//
//  CZEmoticonManager.swift
//  表情键盘新工程-74.准备
//
//  Created by itcast on 16/5/22.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

// 获取Emoticons.bundle路径
let emoticonBundlePath = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!

class CZEmoticonManager: NSObject {
    // 单例
    static let sharedManager: CZEmoticonManager = CZEmoticonManager()
    
    private let emoticonsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/emoticons.plist"
    
    /// 所有表情包, 所有表情包只需要加载一次, 初始化属性的时候,对象还没有创建,用不了对象的方法,懒加载的属性是用到的时候才去加载
    lazy var emoticonPackageModels: [CZEmoticonPackageModel] = self.loadEmoticonPackageModels()
    
    private override init() {
        super.init()
    }
    
    /**
     加载所有表情包
     
     - returns: 所有表情包
     */
    private func loadEmoticonPackageModels() -> [CZEmoticonPackageModel] {
        let recentPackageModel = CZEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: loadRecentEmoticons())
        let defaultPackageModel = loadEmoticonPackageModel("com.sina.default")
        let emojiPackageModel = loadEmoticonPackageModel("com.apple.emoji")
        let lxhPackageModel = loadEmoticonPackageModel("com.sina.lxh")
        
        return [recentPackageModel, defaultPackageModel, emojiPackageModel, lxhPackageModel]
    }
    
     /**
     加载一个表情包
     
     - parameter id: 表情包的文件夹名称
     
     - returns: 表情包模型
     */
    private func loadEmoticonPackageModel(id: String) -> CZEmoticonPackageModel {
        // Emoticons.bundle/id/info.plist
        
        // 拼接info.plist路径
        let infoPath = emoticonBundlePath + "/" + id + "/info.plist"
        
        // 读取info.plist里面的内容
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
//        print("加载到的info.plist内容: \(infoDict)")
        
        // 获取infoDict里面的内容
        let group_name_cn = infoDict["group_name_cn"] as! String
        let emoticonsArr = infoDict["emoticons"] as! [[String: String]]
        
        // 定义空数组存放表情模型
        var emoticonModels = [CZEmoticonModel]()
        
        // 获取emoticons中的每一个字典
        for dict in emoticonsArr {
            // 字典转模型(表情模型)
            let emoticonModel = CZEmoticonModel(dict: dict, id: id)
            
            // 将表情模型添加到数组中
            emoticonModels.append(emoticonModel)
        }
        
        // 创建表情包模型
        return CZEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoticonModels)
    }
    
    /**
     将模型添加到最近这组
     
     - parameter emoitconModel: 要添加的模型
     */
    func addRecentEmoticon(emoitconModel: CZEmoticonModel) {
        // 获取最近这组的第一页数据
        var pageEmoticon = emoticonPackageModels[0].pageEmotions[0]
        
        var sameEmoticon: CZEmoticonModel?
        // 判断是否已经存在
        for e in pageEmoticon {
            // emoji表情判断字符串
            if (e.emoji != nil && e.emoji == emoitconModel.emoji) || (e.chs != nil && e.chs == emoitconModel.chs) {
                sameEmoticon = e
                break
            }
        }
        
        // 已经存在就删除
        if let se = sameEmoticon {
            let index = pageEmoticon.indexOf(se)
            
            pageEmoticon.removeAtIndex(index!)
        }
        
        // 添加到最前
        pageEmoticon.insert(emoitconModel, atIndex: 0)
        
        // 判断是否超过20个
        if pageEmoticon.count > CZEmoticonNumberOfPage {
            pageEmoticon.removeLast()
        }
        
        // 修改pageEmoticon数组不会影响原来的数组
        // 赋值回去
        emoticonPackageModels[0].pageEmotions[0] = pageEmoticon

        print("emoticonsPath: \(emoticonsPath)")
        // 将这个数组里面的所有表情模型保存起来
        NSKeyedArchiver.archiveRootObject(pageEmoticon, toFile: emoticonsPath)
    }
    
    // 加载最近表情
    private func loadRecentEmoticons() -> [CZEmoticonModel] {
        if let emoticons = NSKeyedUnarchiver.unarchiveObjectWithFile(emoticonsPath) as? [CZEmoticonModel] {
            // 加载出表情数组
            return emoticons
        } else {
            // 没加载出来
            return [CZEmoticonModel]()
        }
    }
}
